#include "interviewlistwidget.h"
#include "ui_interviewlistwidget.h"
#include "debug.h"

InterviewListWidget::InterviewListWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::InterviewListWidget)
{
    ui->setupUi(this);
    init();
}

InterviewListWidget::~InterviewListWidget()
{
    delete ui;
}

void InterviewListWidget::clear()
{
    setCardList(QList<model::InterviewInfo>());
}

#include <QScrollBar>
void InterviewListWidget::setCardList(const QList<model::InterviewInfo> &interviews)
{
    if(!_scrollArea || !_container || !_container->layout()) return;
    this->hide();

    qint64 cardsSize = _cards.size(), size = interviews.size();
    qDebug() << "已有" << cardsSize << "个卡片, 设置" << size << "个卡片";

    if (cardsSize < size) {
        for(int i = 0, need = size - cardsSize; i < need; ++i) {
            auto card = new InterviewCard(_container);
            _cards.push_back(card);
            _container->layout()->addWidget(card);
        }
    } else if (cardsSize > size) {
        for (int i = size; i < cardsSize; ++i) {
            _container->layout()->removeWidget(_cards[i]);
            _cards[i]->deleteLater();
        }
        _cards.resize(size);
    }
    qDebug() << "已有" << cardsSize << "个卡片, 设置" << size << "个卡片";

    for(int i = 0; i < size; ++i) {
        auto& interview = interviews[i];
        _cards[i]->set(interview);
        QObject::disconnect(_cards[i], &InterviewCard::clicked, nullptr, nullptr);
        connect(_cards[i], &InterviewCard::clicked, [this, interview]{
            this->showInterview(interview);
        });
    }

    _scrollArea->verticalScrollBar()->setValue(0);
    this->show();
}

void InterviewListWidget::hideRecommendBtn()
{
    ui->btn_recommend->setFixedSize(0, 0);
}

void InterviewListWidget::hideSearchEdit()
{
    ui->lineEdit_search->setFixedSize(0, 0);
}

void InterviewListWidget::init()
{
    initStyleSheet();
    initPanel();
    initBody();
}

#include "pagecontroller.h"
void InterviewListWidget::initStyleSheet()
{
    ui->panel->setStyleSheet(R"(background-color: transparent;)");
    ui->head->setStyleSheet(R"(background-color: transparent;)");
    ui->body->setStyleSheet(R"(background-color: transparent;)");

    ui->lineEdit_search->setStyleSheet(R"(QLineEdit { padding-left: 30px; border-radius: 15px; border: 1px solid transparent; background: qlineargradient( x1:0, y1:0, x2:1, y2:0, stop:0 #dbeafe, stop:1 #fce7f3 ); color: #4b5563; font-size: 22px; background-repeat: no-repeat; background-position: 10px center; background-origin: content; background-clip: padding; } QLineEdit:!focus { color: #9ca3af; })");

    ui->btn_recommend->setStyles(R"(border-radius: 12px; color: #787F8D;)", R"(background-color: transparent; )", R"(background-color: #F9CFE4; )");
    ui->btn_latest->setStyles(R"(border-radius: 12px; color: #787F8D;)", R"(background-color: transparent; )", R"(background-color: #F9CFE4; )");
    auto controller = new PageController(nullptr, this);
    controller->addPage(ui->btn_recommend, nullptr);
    controller->switchToPage(controller->addPage(ui->btn_latest, nullptr));
}

void InterviewListWidget::initPanel()
{
    this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    this->layout()->setContentsMargins(0, 0, 0, 0);
    this->layout()->setSpacing(0);

    ui->panel->layout()->setContentsMargins(0, 0, 0, 0);
    ui->panel->layout()->setSpacing(0);

    ui->head->setFixedHeight(60);
    ui->head->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

    ui->head->layout()->setContentsMargins(0, 5, 10, 5);
    ui->head->layout()->setSpacing(10);

    ui->lineEdit_search->setFixedSize(350, 50);
    ui->btn_recommend->setFixedSize(60, 40);
    ui->btn_latest->setFixedSize(60, 40);

    ui->body->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
}

#include <QScrollArea>
void InterviewListWidget::initBody()
{
    // 1) 新建一个主布局，设置给 ui->body
    QVBoxLayout *mainLayout = new QVBoxLayout(ui->body);
    mainLayout->setContentsMargins(0, 0, 0, 0);

    // 2) 新建 QScrollArea 及其内部容器
    _scrollArea = new QScrollArea(ui->body);

    _container = new QWidget;
    _container->setStyleSheet(R"( background-color: transparent;)");

    QVBoxLayout* containerLayout = new QVBoxLayout(_container);
    containerLayout->setSpacing(10);
    containerLayout->setContentsMargins(20, 0, 20, 0);
    containerLayout->setAlignment(Qt::AlignTop); // 布局内所有子控件顶对齐

    // 3) 设置 scrollArea
    _scrollArea->setWidget(_container);
    _scrollArea->setWidgetResizable(true);
    _scrollArea->setStyleSheet(R"( QScrollArea { border: none; background-color: transparent; } QScrollArea > QWidget { background-color: transparent; } QScrollBar:vertical { background-color: transparent; /* 透明背景 */ width: 9px; border: none; } QScrollBar::handle:vertical { background-color: #dcdfe4; border-radius: 4px; min-height: 20px; /* 最小高度 */ } QScrollBar::handle:vertical:hover { background-color: #bec3ca; } QScrollBar::handle:vertical:pressed { background-color: #a8adb5; /* 新增:按下状态 */ } /* 关键:定义滑块上下的空白区域 */ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { background: transparent; } QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { height: 0px; /* 隐藏箭头 */ background: transparent; } QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { background: none; } )");
    _scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);

    // 4) 将 scrollArea 加到主布局里
    mainLayout->addWidget(_scrollArea);
}

#include "interviewdialog.h"
void InterviewListWidget::showInterview(const model::InterviewInfo &interview)
{
    qDebug() << "显示面经";
    InterviewDialog dialog(this);
    dialog.set(interview);
    dialog.exec();
}

#include "model/datacenter.h"
void InterviewListWidget::on_btn_recommend_clicked()
{
#if TEST_UI
#include "model/data.h"
    QList<model::InterviewInfo> list;
    auto info = model::InterviewInfo();
    info.timestamp = time(0);
    info.sender.nickname = "测试";
    info.title = "测试文章";
    info.content = "这是测试文章的内容这是测试文章的内容.\n这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容这是测试文章的内容";
    int n = std::rand() % 100;
    for(int i = 0; i < n; ++i)
        list.append(info);
    setCardList(list);
#endif
    model::SearchLimits limits;
    limits.searchKey = "推荐";
    auto& dataCenter = model::DataCenter::getInstance();
    dataCenter.searchInterviewAsync(limits);
    connect(&dataCenter, &model::DataCenter::searchInterviewDone, this, &InterviewListWidget::searchInterviewDone, Qt::ConnectionType::UniqueConnection);
}

void InterviewListWidget::searchInterviewDone()
{
    auto ret = model::DataCenter::getInstance().getSearchInterviewResult();
    if (ret)
        setCardList(*ret);
}
